﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Joel.Vishnu.Presentacion.Vistas;
using Joel.Vishnu.Modelo.Entidades;
using Joel.Vishnu.Repositorios;

namespace Joel.Vishnu.Presentacion
{
    public class GestionarFacturasPresentador
    {
        #region Constructores

        public GestionarFacturasPresentador(IGestionarFacturas vista)
        {
            this.vista = vista;
        }

        #endregion

        #region Atributos

        IGestionarFacturas vista;

        #endregion

        #region Propiedades

        private RepositorioCliente RepositorioCliente
        {
            get { return new RepositorioCliente(); }
        }

        private RepositorioEmpleado RepositorioEmpleado
        {
            get { return new RepositorioEmpleado(); }
        }

        private RepositorioFactura RepositorioFactura
        {
            get { return new RepositorioFactura(); }
        }

        private RepositorioProducto RepositorioProducto
        {
            get { return new RepositorioProducto(); }
        }

        private RepositorioConfiguracion RepositorioConfiguracion
        {
            get { return new RepositorioConfiguracion(); }
        }

        #endregion

        #region Metodos

        public void Gestionar()
        {
            Cliente cliente = RepositorioCliente.DevolverPorId(vista.ClienteId);
            if (cliente == null)
                throw new Exception("Debe establecer un cliente.");
            Empleado empleado = RepositorioEmpleado.DevolverPorId(vista.EmpleadoId);
            if (empleado == null)
                throw new Exception("Debe establecer un empleado.");
            if (vista.ListaFacturaDetalles.Count == 0)
                throw new Exception("Debe agregar al menos un producto a la descripción de venta.");
            Factura factura = new Factura();
            factura.Cliente = cliente;
            factura.Empleado = empleado;
            factura.FechaHora = DateTime.Now;
            factura.Detalles = vista.ListaFacturaDetalles;
            factura.Iva = Convert.ToDecimal(vista.Iva.Substring(1));
            RepositorioFactura.Insertar(factura);
            foreach (FacturaDetalle item in factura.Detalles)
                RepositorioFactura.InsertarDetalles(item, factura);
        }

        public void ActualizarClientes()
        {
            vista.ListaClientes = (from item in RepositorioCliente.DevolverTodos()
                                   orderby item.ApellidoNombre ascending
                                   select item).ToList();
        }

        public void ActualizarEmpleados()
        {
            vista.ListaEmpleados = (from item in RepositorioEmpleado.DevolverTodos()
                                    orderby item.ApellidoNombre ascending
                                    select item).ToList();
        }

        public void ActualizarProductos()
        {
            vista.ListaProductos = (from item in RepositorioProducto.DevolverTodos()
                                    orderby item.Nombre ascending
                                    select item).ToList();
        }

        public void InicializarListaFacturaDetalles()
        {
            vista.ListaFacturaDetalles = new List<FacturaDetalle>();
        }

        public Producto TraerProductoPorId(Int32 productoId)
        {
            Producto producto = new Producto();
            producto = RepositorioProducto.DevolverPorId(productoId);
            return producto;
        }

        public void Inicializar()
        {
            ActualizarClientes();
            ActualizarEmpleados();
            ActualizarProductos();
            InicializarListaFacturaDetalles();
        }

        public void AgregarDetalle()
        {
            var lista = vista.ListaFacturaDetalles;
            Producto producto = RepositorioProducto.DevolverPorId(vista.ProductoId);
            if (producto == null)
                throw new Exception("Debe seleccionar un producto.");
            if (vista.Cantidad <= 0)
                throw new Exception("La cantidad debe ser mayor a cero.");
            FacturaDetalle facturaDetalle = new FacturaDetalle();
            facturaDetalle.Producto = producto;
            facturaDetalle.Precio = producto.PrecioLista;
            facturaDetalle.Cantidad = vista.Cantidad;
            lista.Add(facturaDetalle);
            vista.ListaFacturaDetalles = null;
            vista.ListaFacturaDetalles = lista;
            CalcularTotales();
        }

        public void RemoverDetalle()
        {
            if (vista.ListaFacturaDetalles.Count == 0)
                throw new Exception("Debe seleccionar algun detalle.");
            var lista = vista.ListaFacturaDetalles;
            lista.RemoveAt(vista.IndiceFacturaDetalleSeleccionada);
            vista.ListaFacturaDetalles = null;
            vista.ListaFacturaDetalles = lista;
            CalcularTotales();
        }

        public void LimpiarCantidad()
        {
            vista.Cantidad = 0;
        }

        public void ResetearGestionFactura()
        {
            Inicializar();
            LimpiarCantidad();
            CalcularTotales();
        }

        private void CalcularTotales()
        {
            Decimal subTotal = 0;
            foreach (var item in vista.ListaFacturaDetalles)
                subTotal += item.Subtotal;
            String iva = RepositorioConfiguracion.DevolverPorNombre("Iva").Valor;
            vista.SubTotal = subTotal.ToString("C2");
            vista.Iva = ((Convert.ToDecimal(iva) / 100) * subTotal).ToString("C2");
            vista.Total = (((Convert.ToDecimal(iva) / 100) * subTotal) + subTotal).ToString("C2");
        }

        #endregion
    }
}
